<?php

require_once APPPATH . 'dao/CuponDAO.php';
require_once APPPATH . 'dao/EstadoCierreRecaudacionDAO.php';

/**
 * Controlador encargado de Manejar la Carga de las Recaudaciones zonales.
 */
class CargaRecaudaciones extends MY_Controller {

    function __construct() {
        parent::__construct();
    }

    /*
     * index() se ejecuta por defecto al ser cargado del controlador
     */

    public function index() {
        //Se comprueba si el controlador es invocado por primera vez, o
        //si es invocado como producto de enviar el formulario en la vista
        //formularioCargaRecaudaciones.php

        if (!$this->input->post('submit')) {
            //Si el controlador es invocado por primera vez, se carga la vista inicial
            $this->cargarVista();
        } else {
            //Si el controlador es cargado por el envío del formulario, entonces
            //son validados los datos enviados desde éste
            $this->validarRecaudaciones();
        }
    }

    /*
     * Se encarga de cargar las vistas correspondientes al formulario de búsqueda
     * y la respuesta de la búsqueda
     */

    private function recaudacionHabilitada() {
        $cuponDAO = new \CuponDAO();
        $hoy = date("Y-m-d");
        //print_r($cuponDAO->getVencimientoUltimoCupon() );
        //Si no hay cupones o si no vencio el ultimo cupon no puedo recaudar
        if ($cuponDAO->getVencimientoUltimoCupon() === FALSE || $cuponDAO->getVencimientoUltimoCupon() >= $hoy)
            return FALSE;
        return TRUE;
    }

    public function cargarVista($mensaje = null, $mensaje2 = null, $submit = false) {
        //Se obtienen los datos para crear los campos del formulario
        $dataFormularioCargaRecaudaciones = $this->obtenerCamposCargaRecaudaciones();
        $dataFormularioCargaRecaudaciones['submit'] = $submit;
        $dataFormularioCargaRecaudaciones['mensaje'] = $mensaje;
        $dataFormularioCargaRecaudaciones['mensaje2'] = $mensaje2;

        //Se cargan los datos necesarios para armar la cabecera del sistema
        $dataCab['title'] = 'Sistema de Administración de Socios';
        $dataCab['textoSuperiorIzq'] = 'DEFENSORES DE LA TECNO';
        $dataCab['css'] = '<link rel="stylesheet" type="text/css" href="' . site_url() . 'application/views/css_estandar/css_pestanias.css" media="screen" />
                           <link rel="stylesheet" type="text/css" href="' . site_url() . 'application/views/css_estandar/datos_form_css.css" media="screen" />';
        $dataCab['nombre'] = 'Administrador';
        $dataCab['posicionamiento'] = 'Home > Registrar Recaudaciones';

        //Se carga la cabecera
        $this->load->view('cabecera', $dataCab);
        //Se carga el formulario de inscripcion de socios
        $this->load->view('formularioCargaRecaudaciones', $dataFormularioCargaRecaudaciones);
        //Se carga una vista con etiquetas de cierre de html y body, y otras mas
        $this->load->view('cierre');
    }

    /*
     * Retorna arreglos con los parámetros necesarios para crear los campos del
     * formulario.
     * Dichos parámetros son pasados a métodos del Form Helper de CodeIgniter
     */

    public function obtenerCamposCargaRecaudaciones() {


        $data['recaudacionHabilitada'] = $this->recaudacionHabilitada();
        /* Campo recaudación zona 1 */
        $data['zona1'] = array(
            'name' => 'zona1',
            'id' => 'zona1',
            'value' => set_value('zona1'),
            'maxlength' => '5',
            'size' => '12',
        );

        /* Campo recaudación zona 2 */
        $data['zona2'] = array(
            'name' => 'zona2',
            'id' => 'zona2',
            'value' => set_value('zona2'),
            'maxlength' => '5',
            'size' => '12',
        );

        /* Campo recaudación zona 3 */
        $data['zona3'] = array(
            'name' => 'zona3',
            'id' => 'zona3',
            'value' => set_value('zona3'),
            'maxlength' => '5',
            'size' => '12',
        );

        /* Campo recaudación zona 4 */
        $data['zona4'] = array(
            'name' => 'zona4',
            'id' => 'zona4',
            'value' => set_value('zona4'),
            'maxlength' => '5',
            'size' => '12',
        );

        /* Campo recaudación zona 5 */
        $data['zona5'] = array(
            'name' => 'zona5',
            'id' => 'zona5',
            'value' => set_value('zona5'),
            'maxlength' => '5',
            'size' => '12',
        );

        /* Campo recaudación zona 6 */
        $data['zona6'] = array(
            'name' => 'zona6',
            'id' => 'zona6',
            'value' => set_value('zona6'),
            'maxlength' => '5',
            'size' => '12',
        );

        /* Campo recaudación zona 7 */
        $data['zona7'] = array(
            'name' => 'zona7',
            'id' => 'zona7',
            'value' => set_value('zona7'),
            'maxlength' => '5',
            'size' => '12',
        );

        /* Campo recaudación zona 8 */
        $data['zona8'] = array(
            'name' => 'zona8',
            'id' => 'zona8',
            'value' => set_value('zona8'),
            'maxlength' => '5',
            'size' => '12',
        );

        /* Campo recaudación zona 9 */
        $data['zona9'] = array(
            'name' => 'zona9',
            'id' => 'zona9',
            'value' => set_value('zona9'),
            'maxlength' => '5',
            'size' => '12',
        );

        /* Campo recaudación zona 10 */
        $data['zona10'] = array(
            'name' => 'zona10',
            'id' => 'zona10',
            'value' => set_value('zona10'),
            'maxlength' => '5',
            'size' => '12',
        );

        return $data;
    }

    /*
     * Toma la decisión de cargar la vista inicial mostrando los errores cometidos
     * al cargar el formulario, o de cargar la vista nuevamente pero con el resultado
     * de la búsqueda
     */

    public function validarRecaudaciones() {
        //Primero valida que todos los campos del formulario sean correctos.
        //Si no es así, vuelve a mostrar el formulario con los respectivos errores.

        if ($this->validacionMontoRecaudado() === FALSE)
            $this->cargarVista();
        else {

            if ($this->registrarPagoCupones()) {
                $mensaje = 'Se han registrado exitosamente los pagos de los cupones.';

                if ($this->registrarCierreRecaudacion()) {

                    if ($this->resetearDevueltoEnCuponesNoPagados())
                        $mensaje2 = 'Se han registrado exitosamente el cierre de la recaudación del mes.';
                    else
                        $mensaje2 = 'Ha ocurrido un error al registrar el cierre de la recaudación del mes';
                }
                else
                    $mensaje2 = 'Ha ocurrido un error al registrar el cierre de la recaudación del mes';
            }
            else
                $mensaje = 'Ha ocurrido un error al registrar los pagos delos cupones';

            $this->cargarVista($mensaje, $mensaje2, TRUE);
        }
    }

    private function resetearDevueltoEnCuponesNoPagados() {

        try {
            $cuponDAO = new \CuponDAO();

            $cupones = $cuponDAO->getCuponesNoPagados();

            if ($cupones !== FALSE)
                foreach ($cupones as $cupon) {
                    $cupon->setDevuelto(FALSE);

                    $cuponDAO->em->persist($cupon);
                }

            $cuponDAO->em->flush();

            $alta = TRUE;
        } catch (Exception $e) {
            $alta = FALSE;
        }

        return $alta;
    }

    /**
     * Se registra el cierre efectivo de la recaudación del mes.
     * Retorna true si la operación se ha llevado a cabo satisfactoriamente, false si
     * ha ocurrido algún error.
     * 
     * @return boolean 
     */
    private function registrarCierreRecaudacion() {
        try {
            $estadoDAO = new \EstadoCierreRecaudacionDAO();

            $estado = $estadoDAO->getEstadoCierreRecaudacion();

            $estado->setEmisionHabilitada(TRUE);

            $estadoDAO->em->persist($estado);

            $estadoDAO->em->flush();
            $cierre = TRUE;
        } catch (Exception $e) {
            $cierre = FALSE;
        }

        return $cierre;
    }

    /*
     * Valida los datos introducidos en el formulario mediante el uso de la librería
     * Form_validation de CodeIgniter
     * En este caso, se ha creado un método de validación
     */

    public function validacionMontoRecaudado() {

        $_POST['zona1'] = (trim($_POST['zona1']) == '') ? '0' : $_POST['zona1'];
        $_POST['zona2'] = (trim($_POST['zona2']) == '') ? '0' : $_POST['zona2'];
        $_POST['zona3'] = (trim($_POST['zona3']) == '') ? '0' : $_POST['zona3'];
        $_POST['zona4'] = (trim($_POST['zona4']) == '') ? '0' : $_POST['zona4'];
        $_POST['zona5'] = (trim($_POST['zona5']) == '') ? '0' : $_POST['zona5'];
        $_POST['zona6'] = (trim($_POST['zona6']) == '') ? '0' : $_POST['zona6'];
        $_POST['zona7'] = (trim($_POST['zona7']) == '') ? '0' : $_POST['zona7'];
        $_POST['zona8'] = (trim($_POST['zona8']) == '') ? '0' : $_POST['zona8'];
        $_POST['zona9'] = (trim($_POST['zona9']) == '') ? '0' : $_POST['zona9'];
        $_POST['zona10'] = (trim($_POST['zona10']) == '') ? '0' : $_POST['zona10'];

        $this->form_validation->set_rules('zona1', 'Zona 1', 'required|numeric|max_length[5]|validar_monto_recaudado[1]|xss_clean|cleanQuery');

        $this->form_validation->set_rules('zona2', 'Zona 2', 'required|numeric|max_length[5]|validar_monto_recaudado[2]|xss_clean|cleanQuery');

        $this->form_validation->set_rules('zona3', 'Zona 3', 'required|numeric|max_length[5]|validar_monto_recaudado[3]|xss_clean|cleanQuery');

        $this->form_validation->set_rules('zona4', 'Zona 4', 'required|numeric|max_length[5]|validar_monto_recaudado[4]|xss_clean|cleanQuery');

        $this->form_validation->set_rules('zona5', 'Zona 5', 'required|numeric|max_length[5]|validar_monto_recaudado[5]|xss_clean|cleanQuery');

        $this->form_validation->set_rules('zona6', 'Zona 6', 'required|numeric|max_length[5]|validar_monto_recaudado[6]|xss_clean|cleanQuery');

        $this->form_validation->set_rules('zona7', 'Zona 7', 'required|numeric|max_length[5]|validar_monto_recaudado[7]|xss_clean|cleanQuery');

        $this->form_validation->set_rules('zona8', 'Zona 8', 'required|numeric|max_length[5]|validar_monto_recaudado[8]|xss_clean|cleanQuery');

        $this->form_validation->set_rules('zona9', 'Zona 9', 'required|numeric|max_length[5]|validar_monto_recaudado[9]|xss_clean|cleanQuery');

        $this->form_validation->set_rules('zona10', 'Zona 10', 'required|numeric|max_length[5]|validar_monto_recaudado[10]|xss_clean|cleanQuery');
        //Se ejecutan las reglas establecidas sobre los campos del formulario en cuestión
        //y se retornan los resultados de la validación
        return $this->form_validation->run();
    }

    /**
     * Método encargado de averiguar cuáles cupones fueron pagados,
     * restando a los cupones generados, los cupones devueltos.
     * Luego, los marca como pagados.
     * Retorna true si ha sido realizada la operación satisfactoriamente, false en otro caso.
     * 
     * @return boolean 
     */
    private function registrarPagoCupones() {

        $cuponModel = new models\M_cupon();
        return $cuponModel->registrarPagoCupones();
    }

}

?>
